package com.lanhe.common.utils.weixinUtils;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.lanhe.common.utils.weixinUtils.vo.LoginCodeVo;
import com.lanhe.common.utils.weixinUtils.vo.WeiXinUserVo;
import com.lanhe.common.utils.http.HttpUtils;
import com.lanhe.common.utils.weixinUtils.vo.LoginCodeVo;
import com.lanhe.common.utils.weixinUtils.vo.WeiXinUserVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class WeiXinUtils {

private static final Logger log =  LoggerFactory.getLogger(WeiXinUtils.class);

    @Value("wx5fb9971d243458dc")
    private String appid;

    @Value("04a614a37a30a66b6d2d3ba7651107fb")
    private String secret;

    /**获取openId**/
    private final static String JSCODE2SESSION_URL = "https://api.weixin.qq.com/sns/jscode2session";
    /**关于网页授权access_token和普通access_token的区别
     微信网页授权是通过OAuth2.0机制实现的，在用户授权给公众号后，公众号可以获取到一个网页授权特有的接口调用凭证（网页授权access_token），通过网页授权access_token可以进行授权后接口调用，如获取用户基本信息；
     其他微信接口，需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。*/
    /**普通token**/
    private final static String ORDINARY_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";
    /**获取授权token**/
    public final static String AUTHORIZE_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token";
    /**微信获取用户信息地址**/
    public final static String USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo";


    // 微信登录
    public LoginCodeVo wechatLogin(String code) {
        LoginCodeVo loginCodeVo = new LoginCodeVo();

        log.info("入参:【{}】", code);
        try {
            String resp = HttpUtils.sendGet(AUTHORIZE_TOKEN_URL, "grant_type=authorization_code&appid=" + appid + "&secret=" + secret+ "&code=" + code);
            log.info("接口返回:【{}】", resp);
            JSONObject json = JSON.parseObject(resp);
            if (json.containsKey("access_token")) {
                loginCodeVo.setOpenId(json.getString("openid"));
                loginCodeVo.setAccessToken(json.getString("access_token"));
            } else {
                log.error("获取access_token失败:{}", json.toJSONString());
            }
        } catch (Exception e) {
            log.error("异常:{}", e);
            return loginCodeVo;
        }
        return loginCodeVo;
    }

    public WeiXinUserVo getUserInfo(LoginCodeVo loginCodeVo) {
        WeiXinUserVo weiXinUserVo = null;

        String resp = HttpUtils.sendGet(USER_INFO_URL, "lang=zh_CN&openid=" + loginCodeVo.getOpenId() + "&access_token=" + loginCodeVo.getAccessToken());
        log.info("接口返回:【{}】", resp);

        JSONObject jsonObject = JSON.parseObject(resp);
        System.err.println("jsonObject "+jsonObject );
        try {
            weiXinUserVo = new WeiXinUserVo();
            weiXinUserVo.setOpenId(jsonObject.getString("openid"));
            weiXinUserVo.setUnionId(jsonObject.getString("unionid"));
            // 昵称
            weiXinUserVo.setNickname(jsonObject.getString("nickname"));
            //用户的性别（1是男性，2是女性，0是未知）
            weiXinUserVo.setSex(jsonObject.getInteger("sex"));
            //用户所在国家
            weiXinUserVo.setCountry(jsonObject.getString("country"));
            //用户所在省份
            weiXinUserVo.setProvince(jsonObject.getString("province"));
            //用户所在城市
            weiXinUserVo.setCity(jsonObject.getString("city"));
            // 用户的语言，简体中文为zh_CN
            weiXinUserVo.setLanguage(jsonObject.getString("language"));
            // 用户头像
            weiXinUserVo.setHeadImgUrl(jsonObject.getString("headimgurl"));

        }catch (Exception e){
            int errorCode = jsonObject.getInteger("errcode");
            String errorMsg = jsonObject.getString("errmsg");
            System.err.printf("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);
            return null;
        }


        return weiXinUserVo;
    }
}
